package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConst;
import com.itheima.dao.MenuDao;
import com.itheima.dao.PermissionDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.entity.Result;
import com.itheima.exception.BusinessRuntimeException;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Permission;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class MenuServiceImpl implements MenuService {

    @Autowired
    MenuDao menuDao;


    @Override
    public List<Menu> findByPage(QueryPageBean queryPageBean) {
        log.debug("service:" + queryPageBean);
        //条件查询
        List<Menu> page = menuDao.findByCondition(queryPageBean.getQueryString());
        log.debug("page{"+page+"}");
        return page;
    }

    @Override
    public List<Map<String, String>> findParentName() {
        return menuDao.findParentName();
    }

    @Override
    public void add(Map<String, String> menuMap) {
        String parentName = menuMap.get("parentName");
        Menu menuData = new Menu();
        //如果添加的菜单数据是根菜单
        if (parentName==null){
            Menu menu = menuDao.findMaxPathMenu();
            menuData.setName(menuMap.get("name"));
            menuData.setLinkUrl(menuMap.get("linkUrl"));
            menuData.setPriority(1);
            menuData.setPath(String.valueOf(Integer.parseInt(menu.getPath())+1));
            menuData.setLevel(1);
            menuData.setParentMenuId(null);
            //如果菜单数据有父菜单
        }else{
            Menu menu = menuDao.findMenuByName(parentName);
            menuData.setName(menuMap.get("name"));
            menuData.setLinkUrl(menuMap.get("linkUrl"));
            menuData.setLevel(menu.getLevel()+1);
            menuData.setParentMenuId(menu.getId());
            //通过查询父节点的level确定path字段、priority字段
            List<Menu> childMenu = menuDao.findChildMenuByName(parentName);
            if(menu.getLevel()==1){
                if(childMenu.size()==0)
                {
                    menuData.setPriority(1);
                    menuData.setPath("/"+menu.getPath()+"-"+1);
                }else{
                   Menu maxPriorityMenu = menuDao.findMaxPriorityChildMenuByName(parentName);
                    menuData.setPriority(maxPriorityMenu.getPriority()+1);
                    menuData.setPath("/"+menu.getPath()+"-"+(maxPriorityMenu.getPriority()+1));
                }
            }else{
                if(childMenu.size()==0)
                {
                    menuData.setPriority(1);
                    menuData.setPath(menu.getPath()+"-"+1);
                }else{
                    Menu maxPriorityMenu = menuDao.findMaxPriorityChildMenuByName(parentName);
                    menuData.setPriority(maxPriorityMenu.getPriority()+1);
                    menuData.setPath(menu.getPath()+"-"+(maxPriorityMenu.getPriority()+1));
                }
            }
        }
        //添加数据
        menuDao.addMenu(menuData);
    }

    @Override
    public List<Map<String, String>> findById(Integer id) {
        return  menuDao.findById(id);
    }

    @Override
    public Menu findMenuById(Integer id) {
        return menuDao.findMenuById(id);
    }

    @Override
    public void edit(Menu menu) {
        menuDao.edit(menu);
    }

    @Override
    public void delById(Integer id) {
        //查询当前权限是否和角色关联
        long count = menuDao.findCountByMenuId(id);
        if(count > 0){
            log.debug("当前菜单被角色引用，不能删除!!!");
            //当前检查项被引用，不能删除
            throw new BusinessRuntimeException("当前菜单被角色引用，不能删除!!!");
        }
        menuDao.delById(id);
        log.debug("删除成功!!!");
    }

    @Override
    public List<Menu> findAll() {
        return menuDao.findAll();
    }
}
